package com.koron.css2.clientCenter.mapper;

import com.koron.css2.baseConfig.bean.BookBean;
import com.koron.css2.clientCenter.bean.*;
import com.koron.css2.clientCenter.queryBean.UserChangeQueryBean;
import com.koron.css2.clientCenter.queryBean.UserInfoQueryBean;
import com.koron.css2.clientCenter.vo.ChargeInfoListVO;
import com.koron.css2.clientCenter.vo.UserInfoListVO;
import com.koron.css2.clientCenter.vo.UserInfoSelectVo;
import com.koron.css2.clientCenter.vo.UserPhoneListVO;
import com.koron.css2.meterService.bean.MsInfoBean;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 客户管理数据层
 * tableType:1为正式表，2为临时表，3为历史表
 */
public interface UserInfoMapper {

    /**
     * 批量修改用户信息状态字段值
     * @param idList 主键ID集合
     * @param status 状态值
     * @param tableType
     * @return
     */
    int batchUpdateStatus(@Param("idList")  List<String> idList, @Param("status") int status, @Param("tableType") int tableType);

    /**
     * 查询抄表周期配置数据列表
     *
     * @return
     */
    public List<ReadCycleConfigBean> readCycleConfigList();

    /**
     * 模糊查询
     *
     * @param fuzzyQuery
     * @param tableType
     * @return
     */
    public List<UserBean> fuzzyQueryUserInfo(@Param("fuzzyQuery") String fuzzyQuery, @Param("tableType") int tableType);

    /**
     * 查询客户管理列表
     *
     * @param uiqBean
     * @return
     */
    List<UserInfoListVO> userInfoList(UserInfoQueryBean uiqBean);

    /**
     * 查询客户管理列表
     *
     * @param uiqBean
     * @return
     */
    List<UserBean> userInfoListSendMsg(UserInfoQueryBean uiqBean);

    @Select("SELECT found_rows() AS rowcount")
    int selectCount();

    /**
     * 客户查询列表
     *
     * @param uiqBean
     * @return
     */
    List<CtmInfoBean> cmtInfoList(UserInfoQueryBean uiqBean);

    /**
     * 查询客户管理列表  //
     *
     * @param uiqBean
     * @return
     */
    List<UserInfoSelectVo> userInfoSelect(UserInfoQueryBean uiqBean);

    String getUserNoBySortNo(UserInfoQueryBean uiqBean);

    /**
     * 根据用户编号获取用户信息
     *
     * @param userNo
     * @return
     */
    UserBean getUserInfoByUserNo(@Param("userNo") String userNo, @Param("tableType") int tableType);


    /**
     * 根据用户编号获取用户信息
     *
     * @param userNo
     * @return
     */
    List<UserBean> getUserInfoByCtmNo(@Param("ctmNo") String userNo, @Param("tableType") int tableType);

    /**
     * 根据条件获取用户信息
     *
     * @return
     */
    UserBean getUserInfo(@Param("bean") UserBean bean, @Param("tableType") int tableType);

//    /**
//     * 通过客户ID查询用户列表
//     *
//     * @param ctmId
//     * @param tableType
//     * @return
//     */
//    List<UserBean> userInfoListByCtmId(@Param("ctmId") String ctmId, @Param("tableType") int tableType);

    /**
     * 修改最后抄码
     */
    int updateUserMrReadingNum(UserBean bean);

    /**
     * 修改用户锁定状态
     *
     * @param lockFlag
     * @return
     */
    int updateUserLockFlag(@Param("userNo") String userNo, @Param("lockFlag") int lockFlag);

    int clearYearWater(@Param("userNo") String userNo);

    /**
     * 获取用户变更信息
     *
     * @param bean
     * @return
     */
    List<UserChangeBean> userChangeList(UserChangeQueryBean bean);

    /**
     * 获取用户快速变更信息
     *
     * @param bean
     * @return
     */
    List<UserChangeBean> quickUserChangeList(UserChangeQueryBean bean);

    /**
     * 获取用户费用信息
     *
     * @param bean
     * @return
     */
    List<ChargeInfoListBean> chargeInfoList(UserChangeQueryBean bean);


    /**
     * 获取用户费用信息 新
     *
     * @param bean
     * @return
     */
    List<ChargeInfoListVO> chargeInfoListNew(UserChangeQueryBean bean);

    List<ChargeInfoListBean> chargeInfoListPrint(UserChangeQueryBean bean);

    ChargeInfoPrintBean chargeInfoPrintQuery(UserChangeQueryBean bean);

    /**
     * 获取用户抄表信息
     *
     * @param bean
     * @return
     */
    List<MeterReadingListBean> meterReadingList(UserChangeQueryBean bean);

    /**
     * 获取用户抄表员及账号
     *
     * @return
     */
    @Select("select b.* from user_info a,base_book b where a.book_no=b.book_no and a.user_no=#{userNo}")
    BookBean selectUserBookInfo(@Param("userNo") String userNo);

    Map<String, Object> meterReadingListTotal(UserChangeQueryBean bean);

    /**
     * 获取用户账户流水
     *
     * @param bean
     * @return
     */
    List<AccountFlowListBean> accountFlowList(UserChangeQueryBean bean);

    /**
     * 根据Id查询用户信息
     *
     * @param id
     * @return
     */
    public UserBean getUserInfoById(@Param("id") String id, @Param("tableType") int tableType);

    public List<UserBean> selectListByIds(@Param("idList") List<String> idList, @Param("tableType") int tableType);

    /**
     * 通过主键ID 查询户号字段信息
     * @param id
     * @param tableType
     * @return
     */
    public String selectUserNoById(@Param("id") String id, @Param("tableType") int tableType);

    /**
     * 变更修改用户信息
     *
     * @param bean
     * @return
     */
    public Integer userInfoUpdateForChange(@Param("bean") UserBean bean, @Param("tableType") int tableType);

    /**
     * 基于id修改用户信息
     *
     * @param bean
     * @return
     */
    public Integer userInfoUpdate(@Param("bean") UserBean bean, @Param("tableType") int tableType);

    /**
     * 基于id修改用户信息
     */
    public Integer userInfoUpdateCtmNo(@Param("id") String id,
                                       @Param("ctmNo") String ctmNo,
                                       @Param("accountNo") String accountNo);

    /**
     * 基于userNo修改用户信息
     *
     * @param bean
     * @return
     */
    void userInfoUpdateByUserNo(@Param("bean") UserBean bean, @Param("tableType") int tableType);

    /**
     * 添加用户信息
     *
     * @param bean
     * @return
     */
    public Integer userInfoAdd(@Param("bean") UserBean bean, @Param("tableType") int tableType);

    /**
     * 销户操作
     * @param user
     */
    public void closeUser(UserBean user);

    /**
     * 添加用户信息List
     *
     * @return
     */
    public Integer userInfoAddList(@Param("list") List<UserBean> list, @Param("tableType") int tableType);

    /**
     * 删除用户信息
     *
     * @param id
     * @return
     */
    public Integer userInfoDelete(@Param("id") String id, @Param("tableType") int tableType);

    /**
     * 更新用户客户编号
     *
     * @param oldCtmNo
     * @param newCtmNo
     * @return
     */
    public Integer userInfoCtmNoUpdate(@Param("oldCtmNo") String oldCtmNo, @Param("newCtmNo") String newCtmNo);

    /**
     * 修改用户停用信息
     *
     * @return
     */
    public Integer userInfoStopUpdate(UserStopBean bean);

    /**
     * 修改用户状态
     *
     * @return
     */
    public Integer userInfoStatusUpdate(@Param("status") String status, @Param("userNo") String userNo);

    /**
     * 过户修改用户信息
     *
     * @param bean
     * @return
     */
    public Integer userInfoUpdateForTransfer(@Param("bean") UserBean bean, @Param("tableType") int tableType);

    /**
     * 根据册本号修改 抄表周期
     */
    public Integer updateUserMrReadingCycle(BookBean bean);

    /**
     * 根据客户查询用户列表
     */
    public List<UserBean> userInfoListByCtm(UserBean bean);

    /**
     * 查询带手机号码的客户列表
     */
    public List<UserPhoneListVO> selectPhoneList(UserInfoQueryBean bean);

    /**
     * 增加三户关系
     *
     * @param id
     * @param ctmNo
     * @param userNo
     * @param accountNo
     * @return
     */
    public Integer userRelationHstAdd(@Param("id") String id, @Param("ctmNo") String ctmNo, @Param("userNo") String userNo, @Param("accountNo") String accountNo);

    /**
     * 修改三户关系
     *
     * @param ctmNo
     * @param userNo
     * @param accountNo
     * @return
     */
    public Integer userRelationHstUpdate(@Param("ctmNo") String ctmNo, @Param("userNo") String userNo, @Param("accountNo") String accountNo, @Param("newUserNo") String newUserNo, @Param("newAccountNo") String newAccountNo);

    /**
     * 删除三户关系
     *
     * @param ctmNo
     * @param userNo
     * @param accountNo
     * @return
     */
    public Integer userRelationHstDelete(@Param("ctmNo") String ctmNo, @Param("userNo") String userNo, @Param("accountNo") String accountNo);

    /**
     * 用户信息导出字段查询
     *
     * @param uiqBean
     * @return
     */
    public List<LinkedHashMap<String, String>> userInfoExport(UserInfoQueryBean uiqBean);

    /**
     * 用户信息导出总数
     *
     * @param uiqBean
     * @return
     */
    public int countUserInfoExport(UserInfoQueryBean uiqBean);


    /**
     * 用水合同相关信息修改
     *
     * @param bean
     * @return
     */
    void updateContractBeanToUser(ContractBean bean);

    void updateContractBeanToCtm(ContractBean bean);

    ContractBean queryContractBean(String userNo);

    /**
     * 修改用户组编号
     *
     * @return
     */
    int updateUserGroupNo(userGroupUpdateBean bean);

    int updateUserGroupNoNull(@Param("userGroupNo") String userGroupNo);

    int updateUserBusinessArea(userGroupUpdateBean bean);

    List<UserInfoListVO> queryUserInfoByUserNos(@Param("userNos") List<String> userNos);

    List<UserInfoListVO> queryUserInfoByBookNos(@Param("bookNos") List<String> bookNos);

    List<UserInfoListVO> queryBusinessAreaByUserNos(@Param("userNos") List<String> userNos);

    UserInfoListVO queryUserInfoByAccountNoAndUserNo(UserBean userBean);

    List<UserInfoListVO> queryUserInfoByAccountNos(UserBean userBean);

    /**
     * 根据id获取用水类型名称
     *
     * @param useWaterType
     * @return
     */
    String selectUseWaterTypeName(@Param("useWaterType") String useWaterType);

    /**
     * 修改客户手机号码冗余字段
     */
    int updateUserMobileByCtmNo(UserBean bean);

    /**
     * 根据用户编号修改通知人手机号
     */
    int updateUserStopWaterLinkMobileByUserNo(UserBean bean);

    /**
     * 修改用户的账户编号
     */
    Integer updateUserAccountNo(UserBean bean);

    /**
     * 更新用户冗余信息
     *
     * @param bean
     * @return
     */
    int updateReduUserInfo(UserBean bean);

    /**
     * 水表厂家
     *
     * @param msInfo
     * @return
     */
    int updateMsInfo(MsInfoBean msInfo);

    /**
     * 模糊查询
     */
    List<String> fuzzyQueryByNoOrName(@Param("fuzzyQuery") String fuzzyQuery);

    /**
     * 同步客户表冗余字段
     */
    int userInfoCtmInfoUpdate(@Param("ctmNo") String ctmNo);

    /**
     * 同步账单表客户名称+地址
     */
    int updateBillDetail(@Param("ctmNo") String ctmNo, @Param("accountPeriod") String accountPeriod);

    /**
     * 同步抄表表客户名称+地址
     */
    int updateMrInfo(@Param("ctmNo") String ctmNo, @Param("accountPeriod") String accountPeriod);

    /**
     * 根据account_no查询账户所属用户数
     */
    int getAccountUserAmountByAccountNo(@Param("accountNo") String accountNo);

    List<String> getCtmNoListByCertNo(@Param("certNo") String certNo);

    List<String> getAccountNoListByCtmNo(@Param("ctmNo") String ctmNo);

    List<UserInfoMergeDetail> getAccountNoListByCTmList(@Param("ctmNoList") List<String> ctmNoList);

    String getCertNoByUserNo(@Param("userNo") String userNo);

    void updateCtmNoAndAccountNoByUserNo(@Param("userNo") String userNo, @Param("ctmNo") String ctmNo, @Param("accountNo") String accountNo);

    void batchUpdateCtmInfoAndAccountNo(@Param("userInfoMergeDetailList") List<UserInfoMergeDetail> userInfoMergeDetailList);


    @MapKey("ctm_no")
    Map<String, Map> getAccountNoCountByCtmNoList(@Param("originalCtmNoList") List<String> originalCtmNoList);

    @MapKey("ctm_no")
    Map<String, Map> getCtmUserAmountByCtmNoList(@Param("ctmNoList") List<String> ctmNoList);

    /**
     * 查询客户管理列表
     *
     * @param uiqBean
     * @return
     */
    List<UserInfoListVO> userInfoDetails(UserInfoQueryBean uiqBean);
    /**
     * 校验三户编号是否重复
     */
    int checkNoFilter(@Param("userNo")String userNo,@Param("ctmNo")String ctmNo,@Param("accountNo")String accountNo);

    /**
     * 查询客户统计列表
     *
     * @param uiqBean
     * @return
     */
    List<UserInfoListVO> userInfoSummary(UserInfoQueryBean uiqBean);

    List<UserBean> getList(@Param("query") UserInfoQueryBean userInfoQueryBean,@Param("tableType") int tableType);

    List<UserBean> getListByIdList(@Param("idList") List<String> idList,@Param("tableType") int tableType);

    int batchInsert(@Param("list") List<UserBean> userBeanList, @Param("tableType") int tableType);

    void batchDelete(@Param("query") UserInfoQueryBean userInfoQueryBean, @Param("tableType") int tableType);

    void batchUpdateClientContractAddr(@Param("userInfoTempIdList") List<String> userInfoTempIdList,
                                       @Param("areaId") String areaId, @Param("tableType") int tableType);

    void batchUpdateBusinessArea(@Param("userInfoTempIdList") List<String> userInfoTempIdList,
                                 @Param("businessArea") String businessArea, @Param("tableType") int usertemp);

    List<String> getAccountNoListByCtmNoList(@Param("ctmNoList") List<String> ctmNoList);

    /**
     * 同步修改用户结构化地址
     */
    int updateWmeterAddress(Map map);
    /**
     * 同步修改用户客户结构化地址
     */
    int updateWmeterCtmAddress(Map map);

    /**
     * 通过code查询结构化地址是否为空
     */
    String findWmeterAddr(String code);
    /**
     * 通过code查询装表、客户单元地址
     */
    String findCmtUserAddr(@Param("table") String table,@Param("code")String code);

    /**
     * 通过code查询结构化地址是否和装表地址相同
     */
    Map findWmeterAddress(String code);
    /**
     * 根据用户编号列表查询状态不为1的用户
     * @param userNos
     * @return
     */
    List<String> queryAbnormalByUserNos(@Param("userNos") List<String> userNos);

    /**
     * 根据用户组号获取用户编号
     * @param groupNos
     * @return
     */
    List<String> getUserNoListByGroupNos(@Param("groupNos") List<String> groupNos);

    List<UserBean> getUserInfoByUserNos(@Param("userNos") List<String> userNos);

    int updateValveStatusByUserNo(@Param("userNo")String userNo ,@Param("valveStatus") String valveStatus);

    /**
     * 根据账户编号查询底下所有用户编号
     * @param accountNo
     * @return
     */
    List<String> selectUserNoByAccountNo(@Param("accountNo") String accountNo);

    int selectUserStatus(@Param("userNo")String userNo);

    int countByCtmNo(@Param("ctmNo")String ctmNo);

    int getCountForExport(UserInfoQueryBean bean);

    String selectUserId(@Param("userNo") String userNo);

    /**
     * 根据用户编号和主键id统计记录数
     * @param userNo 用户编号
     * @param id 主键id
     * @return
     */
    int countByUserNoAndId(@Param("userNo") String userNo, @Param("id") String id);

    /**
     * 根据用户编号统计记录数
     * @param userNo 用户编号
     * @return
     */
    int countByUserNo(@Param("userNo") String userNo);
}
